/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.interfazExtendido;

import java.util.List;
import org.joda.time.LocalDate;
import org.uca.dss.curso2011.grupo1.clases.Hora;
import org.uca.dss.curso2011.grupo1.clases.InformacionReserva;
import org.uca.dss.curso2011.grupo1.clases.RepartoAsientos;
import org.uca.dss.curso2011.grupo1.clases.Reserva;
import org.uca.dss.curso2011.grupo1.interfaz.Compras;
import org.uca.dss.curso2011.grupo1.interfaz.Estado;

/**
 * Implementa la interfazCompras.
 * @author Alejandro.
 */
public class ComprasExtendidas implements InterfazCompras {

    private Compras compras;
    private Estado estado;
    private RepartoAsientos repartoAsientos;
    private CriterioAsientos criterioAsientos;


    public ComprasExtendidas(List<Hora> horas, List<Reserva> reservas, List<InformacionReserva> informacionesReservas, RepartoAsientos repartoAsientos, CriterioAsientos criterioAsientos){
        this.compras = new Compras(horas, reservas, informacionesReservas,repartoAsientos);
        this.estado = new Estado(horas, reservas);
        this.repartoAsientos = repartoAsientos;
        this.criterioAsientos = criterioAsientos;
    }
    /**
     * Reserva un itinerario.
     * @param itinerario itinerario a reservar.
     * @param fecha fecha en la que se realiza el viaje
     * @return una lista con los trayectos reservados en el itinerario.
     */
    public List<ReservaTrayecto> reservaAsiento(Itinerario itinerario, LocalDate fecha) {

        return this.criterioAsientos.reservar(itinerario, this.estado, fecha, this.compras, this.repartoAsientos);
    }
    /**
     * Devuelve el número de asientos libres de un itinerario.
     * @param fecha fecha del itinerario.
     * @param itinerario itinerario a conocer su número de asientos libres.
     * @return número de asientos libres del itinerario.
     */
    public int asientosLibres(LocalDate fecha, Itinerario itinerario) {
        int asientosLibres = 0;
        int asientosLibres2;
        boolean primero = true;
        //Recorremos todos los trayectos del itinerario y nos queamos con el valor minimo de los asientos disponibles.
       for(InformacionTrayecto informacionTrayecto: itinerario){
           if(primero){
               primero = false;

               asientosLibres = this.compras.asientosLibres(informacionTrayecto.getOrigen(),
                                                            informacionTrayecto.getDestino(),
                                                            fecha,
                                                            informacionTrayecto.getHoraSalida());

           }else{
               asientosLibres2 = this.compras.asientosLibres(informacionTrayecto.getOrigen(),
                                                            informacionTrayecto.getDestino(),
                                                            fecha,
                                                            informacionTrayecto.getHoraSalida());
               if(asientosLibres2 < asientosLibres){
                   asientosLibres = asientosLibres2;
               }
           }

       }
       return asientosLibres;
    }

    /**
     * Cancela un trayecto de una reserva.
     * @param reserva reserva a eliminar.
     */
    public void cancelaReserva(ReservaTrayecto reserva) {
        compras.cancelaReserva(reserva.getCodigoReserva());
    }

    /**
     * Cancela todos los trayectos de una reserva.
     * @param reservas lista de reservas a eliminar.
     */
    public void cancelaReserva(List<ReservaTrayecto> reservas) {
        for(ReservaTrayecto reservaTrayecto: reservas){
            this.cancelaReserva(reservaTrayecto);
        }
    }

}
